function CPPParser(source){
  this.initialize(source);
}
$JSI.extend(CPPParser,SourceParser);

CPPParser.prototype.keywordsRegexp = SourceParser.buildKeywordsRegexp([
//datatypes
"HRGN","HRSRC","HSZ","HWINSTA","HWND","INT","INT_PTR","INT32","INT64","LANGID","LCID","LCTYPE",
"LGRPID","LONG","LONGLONG","LONG_PTR","LONG32","LONG64","LPARAM","LPBOOL","LPBYTE","LPCOLORREF",
"LPCSTR","LPCTSTR","LPCVOID","LPCWSTR","LPDWORD","LPHANDLE","LPINT","LPLONG","LPSTR","LPTSTR",
"LPVOID","LPWORD","LPWSTR","LRESULT","PBOOL","PBOOLEAN","PBYTE","PCHAR","PCSTR","PCTSTR","PCWSTR",
"PDWORDLONG","PDWORD_PTR","PDWORD32","PDWORD64","PFLOAT","PHALF_PTR","PHANDLE","PHKEY","PINT",
"PINT_PTR","PINT32","PINT64","PLCID","PLONG","PLONGLONG","PLONG_PTR","PLONG32","PLONG64","POINTER_32",
"POINTER_64","PSHORT","PSIZE_T","PSSIZE_T","PSTR","PTBYTE","PTCHAR","PTSTR","PUCHAR","PUHALF_PTR",
"PUINT","PUINT_PTR","PUINT32","PUINT64","PULONG","PULONGLONG","PULONG_PTR","PULONG32","PULONG64",
"PUSHORT","PVOID","PWCHAR","PWORD","PWSTR","SC_HANDLE","SC_LOCK","SERVICE_STATUS_HANDLE","SHORT", 
"SIZE_T","SSIZE_T","TBYTE","TCHAR","UCHAR","UHALF_PTR","UINT","UINT_PTR","UINT32","UINT64","ULONG",
"ULONGLONG","ULONG_PTR","ULONG32","ULONG64","USHORT","USN","VOID","WCHAR","WORD","WPARAM","WPARAM","WPARAM",
"char","bool","short","int","__int32","__int64","__int8","__int16","long","float","double","__wchar_t",
"clock_t","_complex","_dev_t","_diskfree_t","div_t","ldiv_t","_exception","_EXCEPTION_POINTERS",
"FILE","_finddata_t","_finddatai64_t","_wfinddata_t","_wfinddatai64_t","__finddata64_t",
"__wfinddata64_t","_FPIEEE_RECORD","fpos_t","_HEAPINFO","_HFILE","lconv","intptr_t",
"jmp_buf","mbstate_t","_off_t","_onexit_t","_PNH","ptrdiff_t","_purecall_handler",
"sig_atomic_t","size_t","_stat","__stat64","_stati64","terminate_function",
"time_t","__time64_t","_timeb","__timeb64","tm","uintptr_t","_utimbuf",
"va_list","wchar_t","wctrans_t","wctype_t","wint_t","signed",

//keywords
"break","case","catch","class","const","__finally","__exception","__try",
"const_cast","continue","private","public","protected","__declspec", 
"default","delete","deprecated","dllexport","dllimport","do","dynamic_cast", 
"else","enum","explicit","extern","if","for","friend","goto","inline", 
"mutable","naked","namespace","new","noinline","noreturn","nothrow", 
"register","reinterpret_cast","return","selectany", 
"sizeof","static","static_cast","struct","switch","template","this", 
"thread","throw","true","false","try","typedef","typeid","typename","union", 
"using","uuid","virtual","void","volatile","whcar_t","while"]
);

CPPParser.prototype.partitionsRegexp = SourceParser.buildPartitionsRegexp(
[
      "/\\*(?:[^\\*]|\\*[^/])*\\*/"      //muti-comment
      ,"//.*$"                    //single-comment
      ,'"(?:\\\\.|[^"\\n\\r])*"'  //string
      ,"'(?:\\\\.|[^'\\n\\r])*'"  //string : char
      ,"^\\s*#.*"             //process
]);
dp.sh.Brushes.Sql = function()
{
	var funcs	=	"abs avg case cast coalesce convert count current_timestamp current_user day isnull left lower month nullif replace right session_user space substring sum system_user upper user year";

	var keywords =	"absolute action add after alter as asc at authorization begin bigint binary bit by cascade char character check checkpoint close collate column commit committed connect connection constraint contains continue create cube current current_date current_time cursor database date deallocate dec decimal declare default delete desc distinct double drop dynamic else end end-exec escape except exec execute false fetch first float for force foreign forward free from full function global goto grant group grouping having hour ignore index inner insensitive insert instead int integer intersect into is isolation key last level load local max min minute modify move name national nchar next no numeric of off on only open option order out output partial password precision prepare primary prior privileges procedure public read real references relative repeatable restrict return returns revoke rollback rollup rows rule schema scroll second section select sequence serializable set size smallint static statistics table temp temporary then time timestamp to top transaction translation trigger true truncate uncommitted union unique update values varchar varying view when where with work";

	var operators =	"all and any between cross in join like not null or outer some";

	this.regexList = [
		{ regex: new RegExp("--(.*)$", "gm"),						css: "comment" },			// one line and multiline comments
		{ regex: dp.sh.RegexLib.DoubleQuotedString,					css: "string" },			// double quoted strings
		{ regex: dp.sh.RegexLib.SingleQuotedString,					css: "string" },			// single quoted strings
		{ regex: new RegExp(this.GetKeywords(funcs), "gmi"),		css: "func" },				// functions
		{ regex: new RegExp(this.GetKeywords(operators), "gmi"),	css: "op" },				// operators and such
		{ regex: new RegExp(this.GetKeywords(keywords), "gmi"),		css: "keyword" }			// keyword
		];

	this.CssClass = "dp-sql";
}

dp.sh.Brushes.Sql.prototype	= new dp.sh.Highlighter();
dp.sh.Brushes.Sql.Aliases	= ["sql"];
